package com.kakaxi.mybilibili.utils;

import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.util.Iterator;
import java.util.Map;

/**
 * url工具类
 * Created by kakaxi on 16/10/21.
 */

public class URLUtil {

    /**
     * 对链接进行编码
     *
     * @param url 将要编码的链接
     * @return 编码后的链接
     */
    public static String encodeURL(String url) {
        if (url != null) {
            try {
                return URLEncoder.encode(url, "UTF-8");
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
        }
        return url;
    }

    /**
     * 对链接进行解码
     *
     * @param url 将要解码的链接
     * @return 解码后的链接
     */
    public static String decodeURL(String url) {
        if (url != null) {
            try {
                return URLDecoder.decode(url, "UTF-8");
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
        }
        return url;
    }

    /**
     * 将请求参数还原为key=value的形式
     *
     * @param paramMap 请求参数数据集
     * @return 拼接后的参数字符串
     */
    public static String getParamString(Map<String, String> paramMap) {
        if (paramMap == null) {
            return "";
        }
        StringBuilder queryString = new StringBuilder(256);
        Iterator<?> it = paramMap.keySet().iterator();
        int count = 0;
        while (it.hasNext()) {
            if (count != 0) {
                queryString.append("&");
            }
            String key = (String) it.next();
            String param = paramMap.get(key);
            queryString.append(key);
            queryString.append("=");
            queryString.append(encodeURL(param));
            count++;
        }
        return queryString.toString();
    }

    /**
     * 获取url链接与参数拼接后的链接
     *
     * @param url      将要拼接的链接
     * @param paramMap 请求参数数据集
     * @return 拼接后的链接
     */
    public static String getURLWithParam(String url, Map<String, String> paramMap) {
        if (url != null) {
            String paramStr = getParamString(paramMap);
            if (!paramStr.isEmpty()) {
                if (url.endsWith("?")) { // 判断是否最后以问号结尾
                    return url + paramStr;
                } else {
                    return url + "?" + paramStr;
                }
            }
        }
        return url;
    }

    /**
     * 参数拼接
     *
     * @param paramStr 想要拼接的参数字符串
     * @param paramMap 参数数据集
     * @return 拼接后的参数字符串
     */
    public static String addParam(String paramStr, Map<String, String> paramMap) {
        if (paramStr != null) {
            String addParamStr = getParamString(paramMap);
            if (!addParamStr.isEmpty()) {
                return paramStr + "&" + getParamString(paramMap);
            }
        }
        return paramStr;
    }

    /**
     * 在原有的参数上拼接参数
     *
     * @param urlWithParam 已经带有参数的url
     * @param paramMap     参数数据集
     * @return 多次拼接参数后的链接
     */
    public static String addParamWithURL(String urlWithParam, Map<String, String> paramMap) {
        if (urlWithParam != null) {
            String paramStr = getParamString(paramMap);
            if (!paramStr.isEmpty()) {
                return urlWithParam + "&" + paramStr;
            }
        }
        return urlWithParam;
    }

}
